SQL

NOTE

SQL 기초 문법 정리. 필드 조회(SELECT), 조건식(WHERE), 정렬(ORDER BY), JOIN, 집합 연산(UNION), 서브쿼리, CRUD 구문.

NOTE

원문의 스마트 따옴표·연산자 오타(, NOT IS NULL, MINUSM INSESET 등)를 표준 SQL로 교정함(사실 확인 권장).

💻 예시

필드 조회 (SELECT)

-- 단일/여러 필드 조회
SELECT 필드이름 FROM 테이블;
SELECT 필드이름1, 필드이름2 FROM 테이블;
 
-- 모든 필드 조회
SELECT * FROM 테이블;
 
-- 중복 제거 조회
SELECT DISTINCT 필드이름 FROM 테이블;
 
-- 조건식 적용
SELECT * FROM 테이블 WHERE 필드이름 = 0;
 
-- 여러 조건식
SELECT *
FROM 테이블
WHERE 필드이름1 = 0
  AND 필드이름2 = 0
  OR  필드이름3 = 0;

조건식의 종류

IN/BETWEEN/LIKE는 각각 OR>= <= 조합, 부분 문자열 비교를 더 짧고 읽기 쉽게 표현하기 위한 것이다. 특히 IS NULL/IS NOT NULL이 따로 있는 이유는 SQL에서 NULL은 “값이 없음”을 뜻해 =로 비교할 수 없기 때문이다(필드 = NULL은 항상 결과가 없음으로 평가된다).

WHERE 필드이름 BETWEEN 0 AND 100;
WHERE 필드이름 NOT BETWEEN 0 AND 100;
 
WHERE 필드이름 IN (0, 10, 100);
WHERE 필드이름 NOT IN (0, 10, 100);
 
WHERE 필드이름 IS NULL;
WHERE 필드이름 IS NOT NULL;
 
WHERE 필드이름 LIKE '홍__';      -- '_' : 한 글자 매칭
WHERE 필드이름 NOT LIKE '홍__';
WHERE 필드이름 LIKE '홍%';       -- '%' : 0글자 이상 매칭
WHERE 필드이름 NOT LIKE '홍%';

정렬 (ORDER BY)

DB는 저장된 순서를 보장하지 않으므로, 화면에 특정 순서(최신순, 이름순 등)로 보여줘야 한다면 반드시 ORDER BY를 명시해야 한다.

-- 특정 필드 기준 정렬
SELECT 필드이름 FROM 테이블 ORDER BY 필드이름;
 
-- 정렬 기준이 여러 개
SELECT 필드이름
FROM 테이블
ORDER BY 필드이름1, 필드이름2 DESC, 필드이름3 ASC;

JOIN

여러 테이블에 나뉘어 저장된 데이터를 한 번의 조회로 합쳐 보기 위해 쓴다. 내부 조인은 양쪽에 모두 값이 있는 행만 반환하고, 외부 조인은 한쪽 테이블에 대응 값이 없어도(NULL로 채워서) 결과에 포함시킨다 — 예를 들어 “주문이 없는 회원도 함께 보고 싶다”면 외부 조인이 필요하다.

-- 내부 조인
SELECT 테이블1.필드이름
FROM 테이블1, 테이블2
WHERE 테이블1.필드이름 = 테이블2.필드이름;
 
-- 별칭으로 간소화
SELECT A.필드이름
FROM 테이블1 A, 테이블2 B
WHERE A.필드이름 = B.필드이름;
 
-- 외부 조인 (Oracle (+) 문법)
SELECT A.필드이름
FROM 테이블1 A, 테이블2 B
WHERE A.필드이름 = B.필드이름(+);

NOTE

위 예시는 원문 그대로 암시적 조인(FROM A, B) 형태다. 실무에서는 JOIN ... ON 명시적 조인 사용을 권장한다.

집합 연산 (UNION)

두 쿼리 결과를 위아래로 합칠 때 쓴다. UNION은 중복을 제거하고 UNION ALL은 제거하지 않는데, 중복 제거는 내부적으로 정렬/비교 비용이 들기 때문에 중복이 없다는 걸 알고 있거나 굳이 제거할 필요가 없다면 UNION ALL이 더 빠르다.

SELECT 필드이름 FROM 테이블1
UNION            -- 또는 UNION ALL, MINUS, INTERSECT
SELECT 필드이름 FROM 테이블2;

서브쿼리

조회 조건 자체가 다른 조회 결과에 의존할 때(예: “평균보다 높은 값만 조회”) JOIN으로 표현하기 어렵거나 가독성이 떨어지는 경우에 쓴다. 서브쿼리 결과가 여러 행일 수 있으면 = 대신 IN/ANY/ALL/EXISTS를 써야 한다 — =는 값이 정확히 하나일 때만 쓸 수 있기 때문이다.

-- 서브쿼리 결과가 하나
SELECT 필드이름1
FROM 테이블
WHERE 테이블.필드이름 <= (
    SELECT 필드이름2
    FROM 테이블
    WHERE 조건문
);
 
-- 서브쿼리(중첩) 결과가 여러 개 (IN 외에 ANY, ALL, EXISTS 사용 가능)
SELECT 필드이름1
FROM 테이블
WHERE 테이블.필드이름2 IN (
    SELECT 필드이름2
    FROM 테이블
    WHERE 조건문
);

CRUD

UPDATE/DELETEWHERE 절을 빠뜨리면 테이블 전체가 대상이 되어버리므로(전체 행 수정/삭제), 조건절을 반드시 먼저 확인하는 습관이 중요하다.

-- CREATE
INSERT INTO 테이블 (필드이름1, 필드이름2)
VALUES (값1, 값2);
 
-- UPDATE
UPDATE 테이블
SET 필드이름1 = 값1, 필드이름2 = 값2
WHERE 조건문;
 
-- DELETE
DELETE FROM 테이블
WHERE 조건문;